package com.songyang.yougnsql.core.data.dataItem;

import com.songyang.yougnsql.core.data.DataManagerImpl;
import com.songyang.yougnsql.core.data.page.Page;
import com.songyang.yougnsql.core.utils.ByteUtils;
import com.songyang.yougnsql.core.utils.Address;

import java.util.Arrays;


public interface DataItem {
    /**
     * 将原始数据打包成一个dataItem数据，注意dataItem的格式
     *
     * @param raw 原始数据
     * @return 打包好的数据
     */
    static byte[] wrapDataItemRaw(byte[] raw) {
        byte[] valid = new byte[1];
        byte[] size = ByteUtils.short2Byte((short) raw.length);
        //将许多数组连接到一个数组当中
        return ByteUtils.concat(valid, size, raw);
    }

    /**
     * 从页面的offset处解析处dataItem
     *
     * @param page   页面
     * @param offset 偏移量
     * @param dm     dm
     * @return dataItem
     */
    static DataItem parseDataItem(Page page, short offset, DataManagerImpl dm) {
        byte[] raw = page.getData();
        short size = ByteUtils.parseShort(Arrays.copyOfRange(raw, offset + DataItemImpl.OF_SIZE, offset + DataItemImpl.OF_DATA));
        short length = (short) (size + DataItemImpl.OF_DATA);
        long uid = Address.addressToUid(page.getPageNumber(), offset);
        return new DataItemImpl(Arrays.copyOfRange(raw, offset, offset + length), new byte[length], page, uid, dm);
    }

    /**
     * 将DataItem的是否有效标志位设置为无效
     *
     * @param raw 数据
     */
    static void setDataItemRawInvalid(byte[] raw) {
        raw[DataItemImpl.OF_VALID] = DataItemImpl.INVALID;
    }


    byte[] data();

    void before();

    void unBefore();

    void after(long xid);

    void release();

    void lock();

    void unlock();

    void rLock();

    void rUnLock();

    Page page();

    long getUid();

    byte[] getOldRaw();

    byte[] getRaw();
}
